<?php

declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class CreateInitTable extends AbstractMigration
{
    /**
     * Change Method.
     *
     * Write your reversible migrations using this method.
     *
     * More information on writing migrations is available here:
     * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
     *
     * Remember to call "create()" or "update()" and NOT "save()" when working
     * with the Table class.
     */
    public function change(): void
    {
        // 创建user表
        $table = $this->table('rp_user');
        $table->addColumn('username', 'string', ['limit' => 50])
            ->addColumn('password', 'string', ['limit' => 100])
            ->addColumn('headimg', 'string', ['limit' => 255])
            ->addColumn('login_at', 'datetime', ['default' => 'CURRENT_TIMESTAMP'])
            ->addColumn('updated_at', 'datetime', ['default' => 'CURRENT_TIMESTAMP', 'update' => 'CURRENT_TIMESTAMP'])
            ->create();

        // 创建配置表
        $table = $this->table('rp_config');
        $table->addColumn('type', 'string', ['limit' => 100])
            ->addColumn('name', 'string', ['limit' => 255])
            ->addColumn('value', 'string', ['default' => 'CURRENT_TIMESTAMP'])
            ->create();

        // 创建计划任务表
        $table = $this->table('rp_crontab');
        $table->addColumn('title', 'text', [ 'null' => false])
            ->addColumn('type', 'integer', ['default' => 1, 'null' => false])
            ->addColumn('rule', 'text', [ 'null' => false])
            ->addColumn('rule_params', 'text')
            ->addColumn('target', 'text', [ 'null' => false])
            ->addColumn('parameter', 'text', [ 'null' => false])
            ->addColumn('running_times', 'integer', ['default' => 0, 'null' => false])
            ->addColumn('last_running_time', 'integer', ['default' => 0, 'null' => false])
            ->addColumn('remark', 'text', [ 'null' => false])
            ->addColumn('sort', 'integer', ['default' => 0, 'null' => false])
            ->addColumn('status', 'integer', ['default' => 0, 'null' => false])
            ->addColumn('create_time', 'integer', ['default' => 0, 'null' => false])
            ->addColumn('update_time', 'integer', ['default' => 0, 'null' => false])
            ->addColumn('singleton', 'integer', ['default' => 1, 'null' => false])
            ->create();

        // 创建计划任务日志表
        $table = $this->table('rp_crontab_log');
        $table->addColumn('crontab_id', 'integer', ['null' => false, 'default' => 0])
            ->addColumn('exception', 'text', ['null' => true])
            ->addColumn('create_time', 'integer', ['default' => 0, 'null' => true])
            ->addColumn('update_time', 'integer', ['default' => 0, 'null' => true])
            ->addForeignKey('crontab_id', 'rp_crontab', 'id', ['delete' => 'CASCADE', 'update' => 'CASCADE'])
            ->create();

        // 创建下载器配置表
        $table = $this->table('rp_download');
        $table->addColumn('name', 'string', ['limit' => 255, 'null' => true])
            ->addColumn('type', 'string', ['limit' => 255, 'null' => true])
            ->addColumn('host', 'string', ['limit' => 255, 'null' => true])
            ->addColumn('port', 'string', ['limit' => 255, 'null' => true])
            ->addColumn('username', 'string', ['limit' => 255, 'null' => true])
            ->addColumn('password', 'string', ['limit' => 255, 'null' => true])
            ->addColumn('save_path', 'string', ['limit' => 255, 'null' => true])
            ->addColumn('is_skip_hash', 'tinyinteger', ['limit' => 1, 'null' => true])
            ->addColumn('is_paused', 'tinyinteger', ['limit' => 1, 'null' => true])
            ->addColumn('status', 'tinyinteger', ['limit' => 1, 'null' => true])
            ->addColumn('reseed_sites', 'string', ['limit' => 255, 'null' => true])
            ->create();

        // 创建站点配置表
        $table = $this->table('rp_sites');
        $table->addColumn('site_name', 'string', ['limit' => 255, 'null' => true])
            ->addColumn('site_url', 'string', ['limit' => 255, 'null' => true])
            ->addColumn('api_url', 'string', ['limit' => 255, 'null' => true])
            ->addColumn('passkey', 'string', ['limit' => 255, 'null' => true])
            ->addColumn('download_limit', 'tinyinteger', ['default' => 0, 'null' => true])
            ->addColumn('upload_limit', 'tinyinteger', ['default' => 0, 'null' => true])
            ->addColumn('status', 'tinyinteger', ['default' => 1, 'null' => true])
            ->addColumn('request_interval', 'tinyinteger', ['default' => 1, 'null' => true])
            ->create();

        // 创建系统日志表
        $table = $this->table('rp_system_log');
        $table->addColumn('type', 'text', ['null' => false])
            ->addColumn('msg', 'text', ['null' => false])
            ->create();

        // 常见种子库表
        $table = $this->table('rp_torrent_bank');  
        $table->addColumn('info_hash', 'text')  
              ->addColumn('pieces_hash', 'text')  
              ->addColumn('save_path', 'text')  
              ->addColumn('download_id', 'integer', ['limit' => 3]) 
              ->addIndex( ['pieces_hash', 'download_id'], ['unique' => true,'name'=>'pieces_hash_download_id_unique'])
              ->create();  
  
        // 创建种子缓存表
        $table = $this->table('rp_torrent_cache');  
        $table->addColumn('sid', 'integer', ['null' => false])  
              ->addColumn('info_hash', 'text', ['null' => false])  
              ->addColumn('download_url', 'text', ['null' => false])  
              ->addColumn('save_path', 'text')  
              ->addColumn('status', 'integer', ['default' => 0])  
              ->create(); 
    }
}
